/**
 * @author 夏の寒风
 * @time 2012-12-14
 */

//自定义hashtable
function Hashtable() {
	this._hash = new Object();
	this.put = function (key, value) {
		if (typeof (key) != "undefined") {
			if (this.containsKey(key) == false) {
				this._hash[key] = typeof (value) == "undefined" ? null : value;
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
	this.remove = function (key) { delete this._hash[key]; }
	this.size = function () { var i = 0; for (var k in this._hash) { i++; } return i; }
	this.get = function (key) { return this._hash[key]; }
	this.containsKey = function (key) { return typeof (this._hash[key]) != "undefined"; }
	this.clear = function () { for (var k in this._hash) { delete this._hash[k]; } }
}


var emotions = new Array();
var categorys = new Array();// 分组
var uSinaEmotionsHt = new Hashtable();

// 初始化缓存，页面仅仅加载一次就可以了
$(function () {
	var app_id = '1362404091';
	$.ajax({
		dataType: 'jsonp',
		url: 'https://api.weibo.com/2/emotions.json?source=' + app_id,
		success: function (response) {
			var data = response.data;
			for (var i in data) {
				if (data[i].category == '') {
					data[i].category = '默认';
				}
				if (emotions[data[i].category] == undefined) {
					emotions[data[i].category] = new Array();
					categorys.push(data[i].category);
				}
				emotions[data[i].category].push({
					name: data[i].phrase,
					icon: data[i].icon
				});
				uSinaEmotionsHt.put(data[i].phrase, data[i].icon);
			}
		}
	});
});

//替换
function AnalyticEmotion(s) {
	if (typeof (s) != "undefined") {
		var sArr = s.match(/\[.*?\]/g);
		if (null != sArr && '' != sArr) {
			for (var i = 0; i < sArr.length; i++) {
				if (uSinaEmotionsHt.containsKey(sArr[i])) {
					var reStr = "<img src=\"" + uSinaEmotionsHt.get(sArr[i]) + "\" height=\"22\" width=\"22\" />";
					s = s.replace(sArr[i], reStr);
				}
			}
		}

	}
	return s;
}

(function ($) {
	$.fn.extend({
		insertContent: function (myValue, t) {
			var $t = $(this)[0];
			if (document.selection) { //ie
				this.focus();
				var sel = document.selection.createRange();
				sel.text = myValue;
				this.focus();
				sel.moveStart('character', -l);
				var wee = sel.text.length;
				if (arguments.length == 2) {
					var l = $t.value.length;
					sel.moveEnd("character", wee + t);
					t <= 0 ? sel.moveStart("character", wee - 2 * t - myValue.length) : sel.moveStart("character", wee - t - myValue.length);

					sel.select();
				}
			} else if ($t.selectionStart || $t.selectionStart == '0') {
				var startPos = $t.selectionStart;
				var endPos = $t.selectionEnd;
				var scrollTop = $t.scrollTop;
				$t.value = $t.value.substring(0, startPos) + myValue + $t.value.substring(endPos, $t.value.length);
				this.focus();
				$t.selectionStart = startPos + myValue.length;
				$t.selectionEnd = startPos + myValue.length;
				$t.scrollTop = scrollTop;
				if (arguments.length == 2) {
					$t.setSelectionRange(startPos - t, $t.selectionEnd + t);
					this.focus();
				}
			}
			else {
				this.value += myValue;
				this.focus();
			}
		}
	})
	$.fn.SinaEmotion = function (target) {
		var cat_current;
		var cat_page;
		$(this).click(function (event) {
			event.stopPropagation();
			var eTop = target.offset().top + target.height() + 15;
			var eLeft = target.offset().left - 1;

			if ($('#emotions .categorys')[0]) {
				$('#emotions').css({ top: eTop, left: eLeft });
				$('#emotions').toggle();
				return;
			}
			$('body').append('<div id="emotions"></div>');
			$('#emotions').css({ top: eTop, left: eLeft });
			$('#emotions').html('<div>正在加载，请稍候...</div>');
			$('#emotions').click(function (event) {
				event.stopPropagation();
			});
			$('#emotions').html('<div style="float:right"><a href="javascript:void(0);" id="prev">&laquo;</a><a href="javascript:void(0);" id="next">&raquo;</a></div><div class="categorys"></div><div class="container"></div>');
			$('#emotions #prev').click(function () {
				showCategorys(cat_page - 1);
			});
			$('#emotions #next').click(function () {
				showCategorys(cat_page + 1);
			});
			showCategorys();
			showEmotions();

		});
		$('body').click(function () {
			$('#emotions').remove();
		});
		$.fn.insertText = function (text) {
			this.each(function () {
				if (this.tagName !== 'INPUT' && this.tagName !== 'TEXTAREA') { return; }
				if (document.selection) {
					this.focus();
					var cr = document.selection.createRange();
					cr.text = text;
					cr.collapse();
					cr.select();
				} else if (this.selectionStart || this.selectionStart == '0') {
					var
						start = this.selectionStart,
						end = this.selectionEnd;
					this.value = this.value.substring(0, start) + text + this.value.substring(end, this.value.length);
					this.selectionStart = this.selectionEnd = start + text.length;
				} else {
					this.value += text;
				}
			});
			return this;
		}
		function showCategorys() {
			var page = arguments[0] ? arguments[0] : 0;
			if (page < 0 || page >= categorys.length / 5) {
				return;
			}
			$('#emotions .categorys').html('');
			cat_page = page;
			for (var i = page * 5; i < (page + 1) * 5 && i < categorys.length; ++i) {
				$('#emotions .categorys').append($('<a href="javascript:void(0);">' + categorys[i] + '</a>'));
			}
			$('#emotions .categorys a').click(function () {
				showEmotions($(this).text());
			});
			$('#emotions .categorys a').each(function () {
				if ($(this).text() == cat_current) {
					$(this).addClass('current');
				}
			});
		}
		function showEmotions() {
			var category = arguments[0] ? arguments[0] : '默认';
			var page = arguments[1] ? arguments[1] - 1 : 0;
			$('#emotions .container').html('');
			cat_current = category;
			for (var i = 0; i < emotions[category].length; ++i) {
				$('#emotions .container').append($('<a href="javascript:void(0);" title="' + emotions[category][i].name + '"><img src="' + emotions[category][i].icon + '" alt="' + emotions[category][i].name + '" width="22" height="22" /></a>'));
			}
			$('#emotions .container a').click(function () {
				target.insertText($(this).attr('title'));
				$('#emotions').remove();
			});

			$('#emotions .categorys a.current').removeClass('current');
			$('#emotions .categorys a').each(function () {
				if ($(this).text() == category) {
					$(this).addClass('current');
				}
			});
		}
	}
})(jQuery);
